/**   
 * @文件名： ReflectClient.java 
 * @包名： com.pattern.singleton 
 * @描述： TODO(用一句话描述该文件做什么) 
 * @作者： acl
 * @创建日期： 2016年7月5日 下午11:33:26 
 * @版本： V1.0   
 */
package com.pattern.singleton;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;

/** 
 * @类名： ReflectClient 
 * @描述： 测试反射和反序列话破解单例模式
 * @作者： acl
 * @创建日期： 2016年7月5日 下午11:33:26 
 *  
 */
public class ReflectClient {
	public static void main(String[] args) throws Exception {
		ReflectSingleton s1 = ReflectSingleton.getInstance();
		ReflectSingleton s2 = ReflectSingleton.getInstance();
		System.out.println(s1);
		System.out.println(s2);
		//通过反射的方式直接调用私有构造器
//	  	Class<ReflectSingleton> clazz = (Class<ReflectSingleton>) Class.forName("com.pattern.singleton.ReflectSingleton");
//	  	Constructor<ReflectSingleton> constructor = clazz.getDeclaredConstructor(null);
//	  	constructor.setAccessible(true);
//	  	
//	  	ReflectSingleton s3 = constructor.newInstance();
//	  	ReflectSingleton s4 = constructor.newInstance();
//	  	
//	  	System.out.println(s3);
//	  	System.out.println(s4);
	  	
	  	//通过反序列话的方式构造多个对象
		FileOutputStream fos = new FileOutputStream("d:/a.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(s1);
		oos.close();
		fos.close();
		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
		ReflectSingleton s3 = (ReflectSingleton) ois.readObject();
		System.out.println(s3);
	}
}
